home *** CD-ROM | disk | FTP | other *** search
/ ShareWare OnLine 2 / ShareWare OnLine Volume 2 (CMS Software)(1993).iso / word / wp2latex.zip / WP2LATEX.$T$ / wp2latex.pas < prev    next >
Pascal/Delphi Source File  |  1990-11-18  |  50KB  |  1,977 lines

  1. Program WordPerfect_to_LaTeX;
  2.  
  3. {           Version 1.0
  4.             Date 27-1-1990
  5. }
  6.  
  7. {$R+}       { Range check error }
  8.  
  9.  
  10. Uses Crt;   { Clearscreen }
  11.  
  12. Type  Bin = file of byte;
  13.  
  14. Var
  15.    wpd_fn,
  16.    strip_fn,
  17.    tabel_fn,
  18.    latex_fn  : String;
  19.  
  20.    wpd,
  21.    tabel : Bin;
  22.    strip,
  23.    latex : Text;
  24.  
  25.    num_of_lines_stripfile : Word;
  26.  
  27.    open_com,
  28.    close_com : Array [$0..$10] of String;
  29.  
  30.    Exitsave : pointer;
  31.  
  32.  
  33. Procedure Rd_word(Var f:Bin; Var w:Word);
  34. { Deze procedure leest een woord uit de opgegeven binaire file. }
  35.  
  36. Var
  37.    b : Byte;
  38.  
  39. Begin
  40.    Read(f,b);
  41.    w:=b;
  42.    Read(f,b);
  43.    w:=w+256*b
  44. End;
  45.  
  46.  
  47. Procedure Wr_word(Var f:Bin; w:Word);
  48. { Deze procedure schrijft een woord in de opgegeven binaire file. }
  49.  
  50. Var
  51.    b : Byte;
  52.  
  53. Begin
  54.    b:=w mod 256;
  55.    Write(f,b);
  56.    b:=w div 256;
  57.    Write(f,b);
  58. End;
  59.  
  60.  
  61. Procedure Jump_in_file(Var f:Bin; dis:Longint);
  62. { Deze procedure springt in een binaire file het aantal opgegeven bytes. }
  63.  
  64. Var
  65.    cur_pos : Longint;
  66.  
  67. Begin
  68.    cur_pos := Filepos(f);
  69.    Seek(f,cur_pos+dis);
  70. End;
  71.  
  72.  
  73.  
  74. Procedure Wpd_check;
  75. { Kontroleert of de opgegeven WP-document wel daadwerkelijk een   }
  76. { WP5.0-document is.                                              }
  77.  
  78. Var id1,id2,std1,std2,filetype,dmp1,dmp2,dmp3 : Word;
  79.     Startdoc, Pointer : Longint;
  80.     b:Byte;
  81.  
  82. Begin
  83.    Rd_word(wpd,id1); Rd_word(wpd,id2);
  84.    Rd_word(wpd,std1); Rd_word(wpd,std2);
  85.    Rd_word(wpd,filetype);
  86.    Rd_word(wpd,dmp1); Rd_word(wpd,dmp2); Rd_word(wpd,dmp3);
  87.  
  88.    Startdoc:=std2*65536+std1;
  89.  
  90.    If (id1=$57ff) and (id2=$4350) and
  91.       (filetype=$0A01)  {and (dmp1=$0) and (dmp2=$0) and (dmp3=$0)}
  92.  
  93.    Then Seek(wpd,startdoc)    { Het is een WP5.0-document}
  94.    Else RunError($0201)       { Het is geen WP5.0-document}
  95. End;
  96.  
  97.  
  98.  
  99.  
  100. Procedure Filenames;
  101. { Deze procedure handelt het opgeven van de filenamen af. }
  102.  
  103. Var
  104.    name,
  105.    invoer,
  106.    wpdef,
  107.    latdef,
  108.    filename,
  109.    ext           : String;
  110.    l,p           : Integer;
  111.  
  112. Begin
  113.    If ParamCount<1
  114.    Then wpdef:=''
  115.    Else wpdef:=Paramstr(1);
  116.  
  117.    Writeln;
  118.    Writeln;
  119.    Write('WordPerfect-filename [',wpdef,'] : ');
  120.    Readln(invoer);
  121.    If invoer=''
  122.    Then wpd_fn:=wpdef
  123.    Else wpd_fn:=invoer;
  124.  
  125.    If wpd_fn=''                 { No filename entered }
  126.    Then RunError($200);
  127.  
  128.    name:=wpd_fn;
  129.    l:=Length(name);
  130.    p:=Pos('.',name);
  131.    if p=0 then p:=l+1;
  132.    filename:=copy(name,1,p-1);
  133.  
  134.    strip_fn:=concat(filename,'.STR');
  135.    tabel_fn:=concat(filename,'.TBL');
  136.    latdef:=concat(filename,'.TEX');
  137.  
  138.    Write('LaTeX-filename [',latdef,'] : ');
  139.    Readln(invoer);
  140.    Writeln;
  141.    If invoer=''
  142.    Then latex_fn:=latdef
  143.    Else latex_fn:=invoer;
  144.  
  145.    Assign(wpd,wpd_fn);
  146.    Assign(strip,strip_fn);
  147.    Assign(tabel,tabel_fn);
  148.    Assign(latex,latex_fn);
  149.  
  150. End;
  151.  
  152.  
  153. {$F+}
  154. Procedure Einde_prog;
  155. { Deze procedure wordt aan het einde van het programma aangeroepen. }
  156. { Er wordt gekeken of er zich Run-Time error heeft voor gedaan.     }
  157.  
  158. Var
  159.    save_ErrorAddr : Pointer;
  160.  
  161. Begin
  162.    Writeln;
  163.  
  164.    ExitProc:=Exitsave;
  165.    save_ErrorAddr := ErrorAddr;
  166.    ErrorAddr := nil;
  167.  
  168.    If save_ErrorAddr <> nil
  169.    Then Case Exitcode of
  170.                $0002 : Writeln('File not found.');
  171.                $0003 : Writeln('Path not found.');
  172.                $0100 : Writeln('Program Error.');
  173.                $0200 : Writeln('No filename entered !');
  174.                $0201 : Writeln('Not a WordPerfect 5.0 document !');
  175.  
  176.              Else ErrorAddr := save_ErrorAddr;
  177.         End
  178.  
  179.    Else Begin
  180.            Writeln('Conversion completed.');
  181.            Writeln;
  182.         End;
  183.  
  184.    Writeln;
  185. End;
  186. {$F-}
  187.  
  188.  
  189. Procedure Init_commando;
  190. Begin
  191.    Open_com[$0]:='{\LARGE ';
  192.    Open_com[$1]:='{\Large ';
  193.    Open_com[$2]:='{\large ';
  194.    Open_com[$3]:='{\small ';
  195.    Open_com[$4]:='{\footnotesize ';
  196.    Open_com[$5]:='$^{\rm ';
  197.    Open_com[$6]:='$_{\rm ';
  198.    Open_com[$7]:='';
  199.    Open_com[$8]:='{\it ';
  200.    Open_com[$9]:='';
  201.    Open_com[$A]:='';
  202.    Open_com[$B]:='\underline{\Underline{';
  203.    Open_com[$C]:='{\bf ';
  204.    Open_com[$D]:='';
  205.    Open_com[$E]:='\Underline{';
  206.    Open_com[$F]:='{\sc ';
  207.  
  208.    Close_com[$0]:='}';
  209.    Close_com[$1]:='}';
  210.    Close_com[$2]:='}';
  211.    Close_com[$3]:='}';
  212.    Close_com[$4]:='}';
  213.    Close_com[$5]:='}$';
  214.    Close_com[$6]:='}$';
  215.    Close_com[$7]:='';
  216.    Close_com[$8]:='\/}';
  217.    Close_com[$9]:='';
  218.    Close_com[$A]:='';
  219.    Close_com[$B]:='}}';
  220.    Close_com[$C]:='}';
  221.    Close_com[$D]:='';
  222.    Close_com[$E]:='}';
  223.    Close_com[$F]:='}';
  224. End;
  225.  
  226.  
  227. {---SLAG1----}
  228.  
  229. Procedure Convert_first_strike;
  230. { Dit is de komplete procedure van de eerste slag met zijn eigen proc.'s. }
  231.  
  232. Var
  233.    by  : Byte;
  234.    wo,
  235.    regelnum  : Word;
  236.  
  237.    convperc,
  238.    i     : Integer;
  239.  
  240.    srtdocpos,
  241.    fsize,
  242.    fpos,
  243.    nextdocpos : longint;
  244.  
  245.    lat    : Array[$20..$7F] of String[25];
  246.    char_set  : Array[$80..$FE] of Integer;
  247.    char_code : Array[$80..$FE] of Integer;
  248.    ext_lat   : Array[$80..$FE] of String[25];
  249.  
  250.  
  251.    leegptr,
  252.    openptr               : Array [0..1] of Integer;
  253.    attr_rij              : Array [0..1,0..16] of Byte;
  254.    open_attr_rij         : Array [0..1] of Boolean;
  255.    depth                 : Integer;
  256.  
  257.    envir,
  258.    line_term      : Char;
  259.  
  260.    char_on_line,
  261.    nomore_valid_tabs,
  262.    indenting,
  263.    indent_end,
  264.    ind_text1,
  265.    ind_text2  : Boolean;
  266.  
  267.    ind_leftmargin,
  268.    ind_rightmargin : Word;
  269.  
  270.    num_of_tabs,
  271.    latex_tabpos : Integer;
  272.    tabpos       : Array [1..40] of Word;
  273.    right_tab,
  274.    align_tab,
  275.    center_tab   : Boolean;
  276.  
  277.    WP_sidemargin  : Integer;
  278.  
  279.  
  280.  
  281.  
  282. Procedure WP_Default;
  283. Var
  284.    j : Integer;
  285.  
  286. Begin
  287.    WP_sidemargin := 1200;
  288.  
  289.    tabpos[1]:=$02c5;                      { 1e WP-tab is kantlijn --> }
  290.    For j:=2 to 10
  291.    Do tabpos[j]:=tabpos[j-1]+$02c5;       { Volgende tabs 1,5  cm     }
  292.    For j:=11 to 40                        { ($02c5 wpu) verder        }
  293.    Do tabpos[j]:=$FFFF;
  294.  
  295.    num_of_tabs:=10;
  296. End;
  297.  
  298.  
  299. Procedure Table_Init;
  300. Begin
  301.    lat[$20]:=' ';                        {Space}
  302.    lat[$21]:='!';                        {!}
  303.    lat[$22]:='"';                        {"}
  304.    lat[$23]:='\#';                       {#}
  305.    lat[$24]:='\$';                       {dollar}
  306.    lat[$25]:='\%';                       {%}
  307.    lat[$26]:='\&';                       {&}
  308.    lat[$27]:='''';                        {'}
  309.    lat[$28]:='(';                        {(}
  310.    lat[$29]:=')';                        {)}
  311.    lat[$2A]:='*';                        {*}
  312.    lat[$2B]:='+';                        {+}
  313.    lat[$2C]:=',';                        {,}
  314.    lat[$2D]:='-';                        {-}
  315.    lat[$2E]:='.';                        {.}
  316.    lat[$2F]:='/';                        {/}
  317.    lat[$30]:='0';                        {0}
  318.    lat[$31]:='1';                        {1}
  319.    lat[$32]:='2';                        {2}
  320.    lat[$33]:='3';                        {3}
  321.    lat[$34]:='4';                        {4}
  322.    lat[$35]:='5';                        {5}
  323.    lat[$36]:='6';                        {6}
  324.    lat[$37]:='7';                        {7}
  325.    lat[$38]:='8';                        {8}
  326.    lat[$39]:='9';                        {9}
  327.    lat[$3A]:=':';                        {:}
  328.    lat[$3B]:=';';                        {;}
  329.    lat[$3C]:='$<$';                      {<}
  330.    lat[$3D]:='=';                        {=}
  331.    lat[$3E]:='$>$';                      {>}
  332.    lat[$3F]:='?';                        {?}
  333.    lat[$40]:='@';                        {@}
  334.    lat[$41]:='A';                        {A}
  335.    lat[$42]:='B';                        {B}
  336.    lat[$43]:='C';                        {C}
  337.    lat[$44]:='D';                        {D}
  338.    lat[$45]:='E';                        {E}
  339.    lat[$46]:='F';                        {F}
  340.    lat[$47]:='G';                        {G}
  341.    lat[$48]:='H';                        {H}
  342.    lat[$49]:='I';                        {I}
  343.    lat[$4A]:='J';                        {J}
  344.    lat[$4B]:='K';                        {K}
  345.    lat[$4C]:='L';                        {L}
  346.    lat[$4D]:='M';                        {M}
  347.    lat[$4E]:='N';                        {N}
  348.    lat[$4F]:='O';                        {O}
  349.    lat[$50]:='P';                        {P}
  350.    lat[$51]:='Q';                        {Q}
  351.    lat[$52]:='R';                        {R}
  352.    lat[$53]:='S';                        {S}
  353.    lat[$54]:='T';                        {T}
  354.    lat[$55]:='U';                        {U}
  355.    lat[$56]:='V';                        {V}
  356.    lat[$57]:='W';                        {W}
  357.    lat[$58]:='X';                        {X}
  358.    lat[$59]:='Y';                        {Y}
  359.    lat[$5A]:='Z';                        {Z}
  360.    lat[$5B]:='[';                        {[}
  361.    lat[$5C]:='$\tt\backslash$';          {\}
  362.    lat[$5D]:=']';                        {]}
  363.    lat[$5E]:='\^{';                      {^}
  364.    lat[$5F]:='\_';                       {_}
  365.    lat[$60]:='`';                        {`}
  366.    lat[$61]:='a';                        {a}
  367.    lat[$62]:='b';                        {b}
  368.    lat[$63]:='c';                        {c}
  369.    lat[$64]:='d';                        {d}
  370.    lat[$65]:='e';                        {e}
  371.    lat[$66]:='f';                        {f}
  372.    lat[$67]:='g';                        {g}
  373.    lat[$68]:='h';                        {h}
  374.    lat[$69]:='i';                        {i}
  375.    lat[$6A]:='j';                        {j}
  376.    lat[$6B]:='k';                        {k}
  377.    lat[$6C]:='l';                        {l}
  378.    lat[$6D]:='m';                        {m}
  379.    lat[$6E]:='n';                        {n}
  380.    lat[$6F]:='o';                        {o}
  381.    lat[$70]:='p';                        {p}
  382.    lat[$71]:='q';                        {q}
  383.    lat[$72]:='r';                        {r}
  384.    lat[$73]:='s';                        {s}
  385.    lat[$74]:='t';                        {t}
  386.    lat[$75]:='u';                        {u}
  387.    lat[$76]:='v';                        {v}
  388.    lat[$77]:='w';                        {w}
  389.    lat[$78]:='x';                        {x}
  390.    lat[$79]:='y';                        {y}
  391.    lat[$7A]:='z';                        {z}
  392.    lat[$7B]:='\{';                       {{}
  393.    lat[$7C]:='$|$';                      {|}
  394.    lat[$7D]:='\}';                       { }
  395.    lat[$7E]:='\tidle{';                  {~}
  396.    lat[$7F]:=' ';                        {Don't exsist}
  397. End;
  398.  
  399.  
  400. Procedure Ext_chr_init;
  401. Begin
  402.    char_set[$80]:=$01;  char_code[$80]:=$26;  ext_lat[$80]:='\c{C}';
  403.    char_set[$81]:=$01;  char_code[$81]:=$47;  ext_lat[$81]:='\"{u}';
  404.    char_set[$82]:=$01;  char_code[$82]:=$29;  ext_lat[$82]:='\''{e}';
  405.    char_set[$83]:=$01;  char_code[$83]:=$1D;  ext_lat[$83]:='\^{a}';
  406.    char_set[$84]:=$01;  char_code[$84]:=$1F;  ext_lat[$84]:='\"{a}';
  407.    char_set[$85]:=$01;  char_code[$85]:=$21;  ext_lat[$85]:='\`{a}';
  408.    char_set[$86]:=$01;  char_code[$86]:=$23;  ext_lat[$86]:='\aa ';
  409.    char_set[$87]:=$01;  char_code[$87]:=$27;  ext_lat[$87]:='\c{c}';
  410.    char_set[$88]:=$01;  char_code[$88]:=$2B;  ext_lat[$88]:='\^{e}';
  411.    char_set[$89]:=$01;  char_code[$89]:=$2D;  ext_lat[$89]:='\"{e}';
  412.    char_set[$8A]:=$01;  char_code[$8A]:=$2F;  ext_lat[$8A]:='\`{e}';
  413.    char_set[$8B]:=$01;  char_code[$8B]:=$35;  ext_lat[$8B]:='\"{\i}';
  414.    char_set[$8C]:=$01;  char_code[$8C]:=$33;  ext_lat[$8C]:='\^{\i}';
  415.    char_set[$8D]:=$01;  char_code[$8D]:=$37;  ext_lat[$8D]:='\`{\i}';
  416.    char_set[$8E]:=$01;  char_code[$8E]:=$1E;  ext_lat[$8E]:='\"{A}';
  417.    char_set[$8F]:=$01;  char_code[$8F]:=$22;  ext_lat[$8F]:='\AA ';
  418.    char_set[$90]:=$01;  char_code[$90]:=$28;  ext_lat[$90]:='\''{E}';
  419.    char_set[$91]:=$01;  char_code[$91]:=$25;  ext_lat[$91]:='\ae ';
  420.    char_set[$92]:=$01;  char_code[$92]:=$24;  ext_lat[$92]:='\AE ';
  421.    char_set[$93]:=$01;  char_code[$93]:=$3D;  ext_lat[$93]:='\^{o}';
  422.    char_set[$94]:=$01;  char_code[$94]:=$3F;  ext_lat[$94]:='\"{o}';
  423.    char_set[$95]:=$01;  char_code[$95]:=$41;  ext_lat[$95]:='\`{o}';
  424.    char_set[$96]:=$01;  char_code[$96]:=$45;  ext_lat[$96]:='\^{u}';
  425.    char_set[$97]:=$01;  char_code[$97]:=$49;  ext_lat[$97]:='\`{u}';
  426.    char_set[$98]:=$01;  char_code[$98]:=$8B;  ext_lat[$98]:='\"{y}';
  427.    char_set[$99]:=$01;  char_code[$99]:=$3E;  ext_lat[$99]:='\"{O}';
  428.    char_set[$9A]:=$01;  char_code[$9A]:=$46;  ext_lat[$9A]:='\"{U}';
  429.    char_set[$9B]:=$04;  char_code[$9B]:=$13;  ext_lat[$9B]:='\ ';
  430.    char_set[$9C]:=$04;  char_code[$9C]:=$0B;  ext_lat[$9C]:='\pounds ';
  431.    char_set[$9D]:=$04;  char_code[$9D]:=$0C;  ext_lat[$9D]:='\ ';
  432.    char_set[$9E]:=$04;  char_code[$9E]:=$0D;  ext_lat[$9E]:='\ ';
  433.    char_set[$9F]:=$04;  char_code[$9F]:=$0E;  ext_lat[$9F]:='{\it f}\/';
  434.    char_set[$A0]:=$01;  char_code[$A0]:=$1B;  ext_lat[$A0]:='\''{a}';
  435.    char_set[$A1]:=$01;  char_code[$A1]:=$31;  ext_lat[$A1]:='\''{\i}';
  436.    char_set[$A2]:=$01;  char_code[$A2]:=$3B;  ext_lat[$A2]:='\''{o}';
  437.    char_set[$A3]:=$01;  char_code[$A3]:=$43;  ext_lat[$A3]:='\''{u}';
  438.    char_set[$A4]:=$01;  char_code[$A4]:=$39;  ext_lat[$A4]:='\~{n}';
  439.    char_set[$A5]:=$01;  char_code[$A5]:=$38;  ext_lat[$A5]:='\~{N}';
  440.    char_set[$A6]:=$04;  char_code[$A6]:=$0F;  ext_lat[$A6]:='\astrike ';
  441.    char_set[$A7]:=$04;  char_code[$A7]:=$10;  ext_lat[$A7]:='\ostrike ';
  442.    char_set[$A8]:=$04;  char_code[$A8]:=$08;  ext_lat[$A8]:='?`';
  443.    char_set[$A9]:=$05;  char_code[$A9]:=$10;  ext_lat[$A9]:='~';
  444.    char_set[$AA]:=$06;  char_code[$AA]:=$14;  ext_lat[$AA]:='~';
  445.    char_set[$AB]:=$04;  char_code[$AB]:=$11;  ext_lat[$AB]:='$\frac{1}{2}$';
  446.    char_set[$AC]:=$04;  char_code[$AC]:=$12;  ext_lat[$AC]:='$\frac{1}{4}$';
  447.    char_set[$AD]:=$04;  char_code[$AD]:=$07;  ext_lat[$AD]:='!`';
  448.    char_set[$AE]:=$04;  char_code[$AE]:=$09;  ext_lat[$AE]:='$\ll$';
  449.    char_set[$AF]:=$04;  char_code[$AF]:=$0A;  ext_lat[$AF]:='$\gg$';
  450.    char_set[$E0]:=$08;  char_code[$E0]:=$01;  ext_lat[$E0]:='$\alpha$';
  451.    char_set[$E1]:=$01;  char_code[$E1]:=$17;  ext_lat[$E1]:='$\beta$';
  452.    char_set[$E2]:=$08;  char_code[$E2]:=$06;  ext_lat[$E2]:='$\Gamma$';
  453.    char_set[$E3]:=$08;  char_code[$E3]:=$21;  ext_lat[$E3]:='$\pi$';
  454.    char_set[$E4]:=$08;  char_code[$E4]:=$24;  ext_lat[$E4]:='$\Sigma$';
  455.    char_set[$E5]:=$08;  char_code[$E5]:=$25;  ext_lat[$E5]:='$\sigma$';
  456.    char_set[$E6]:=$08;  char_code[$E6]:=$19;  ext_lat[$E6]:='$\mu$';
  457.    char_set[$E7]:=$08;  char_code[$E7]:=$29;  ext_lat[$E7]:='$\tau$';
  458.    char_set[$E8]:=$08;  char_code[$E8]:=$2C;  ext_lat[$E8]:='$\Phi$';
  459.    char_set[$E9]:=$08;  char_code[$E9]:=$10;  ext_lat[$E9]:='$\theta$';
  460.    char_set[$EA]:=$08;  char_code[$EA]:=$32;  ext_lat[$EA]:='$\Omega$';
  461.    char_set[$EB]:=$08;  char_code[$EB]:=$09;  ext_lat[$EB]:='$\delta$';
  462.    char_set[$EC]:=$06;  char_code[$EC]:=$13;  ext_lat[$EC]:='$\infty$';
  463.    char_set[$ED]:=$08;  char_code[$ED]:=$2D;  ext_lat[$ED]:='$\emptyset$';
  464.    char_set[$EE]:=$08;  char_code[$EE]:=$0B;  ext_lat[$EE]:='$\epsilon$';
  465.    char_set[$EF]:=$06;  char_code[$EF]:=$10;  ext_lat[$EF]:='$\cap$';
  466.    char_set[$F0]:=$06;  char_code[$F0]:=$0E;  ext_lat[$F0]:='$\equiv$';
  467.    char_set[$F1]:=$06;  char_code[$F1]:=$01;  ext_lat[$F1]:='$\pm$';
  468.    char_set[$F2]:=$06;  char_code[$F2]:=$03;  ext_lat[$F2]:='$\geq$';
  469.    char_set[$F3]:=$06;  char_code[$F3]:=$02;  ext_lat[$F3]:='$\leq$';
  470.    char_set[$F4]:=$07;  char_code[$F4]:=$00;  ext_lat[$F4]:='~';
  471.    char_set[$F5]:=$07;  char_code[$F5]:=$01;  ext_lat[$F5]:='~';
  472.    char_set[$F6]:=$06;  char_code[$F6]:=$08;  ext_lat[$F6]:='$\div$';
  473.    char_set[$F7]:=$06;  char_code[$F7]:=$0D;  ext_lat[$F7]:='$\approx$';
  474.    char_set[$F8]:=$06;  char_code[$F8]:=$24;  ext_lat[$F8]:='\degrees ';
  475.    char_set[$F9]:=$06;  char_code[$F9]:=$1F;  ext_lat[$F9]:='~';
  476.    char_set[$FA]:=$06;  char_code[$FA]:=$20;  ext_lat[$FA]:='~';
  477.    char_set[$FB]:=$07;  char_code[$FB]:=$04;  ext_lat[$FB]:='$\surd$';
  478.    char_set[$FC]:=$04;  char_code[$FC]:=$15;  ext_lat[$FC]:='$^{n}$';
  479.    char_set[$FD]:=$04;  char_code[$FD]:=$14;  ext_lat[$FD]:='$^{2}$';
  480.    char_set[$FE]:=$04;  char_code[$FE]:=$02;  ext_lat[$FE]:='~';
  481. End;
  482.  
  483.  
  484. Procedure Make_tabelentry_attr;
  485. Var
  486.    b,
  487.    num_of_attr : Byte;
  488.    j : Integer;
  489.  
  490. Begin
  491.    num_of_attr := openptr[depth];
  492.    Write(tabel,num_of_attr);
  493.  
  494.    For j:=1 to num_of_attr
  495.    Do Write(tabel,attr_rij[depth,j]);
  496.  
  497. End;
  498.  
  499.  
  500.  
  501. Procedure Make_tabelentry_tabset;
  502. Var
  503.    b : Byte;
  504.    j : Integer;
  505.  
  506. Begin
  507.    b := ord('S');
  508.    Write(tabel,b);
  509.  
  510.    b:=num_of_tabs;
  511.    Write(tabel,b);
  512.  
  513.    For j:=1 to num_of_tabs
  514.    Do Wr_word(tabel,tabpos[j]);
  515. End;
  516.  
  517.  
  518. Procedure Make_tabelentry_rightjustification;
  519. Var
  520.    b : Byte;
  521.  
  522. Begin
  523.    b := Ord('U');
  524.    Write(tabel,b);
  525.  
  526.    If by=$81
  527.    Then b:=01                            { regels WEL uitvullen }
  528.    Else b:=00;                           { regels NIET uitvullen }
  529.    Write(tabel,b);
  530. End;
  531.  
  532.  
  533.  
  534.  
  535. Procedure Make_tabelentry_envir_extra_end;
  536. Var
  537.    b : Byte;
  538.  
  539. Begin
  540.  
  541.    Case envir of
  542.       'C' : Begin
  543.                b:=ord('C');
  544.                Write(tabel,b);
  545.             End;
  546.  
  547.       'T' : Begin
  548.                b:=ord('T');
  549.                Write(tabel,b);
  550.             End;
  551.  
  552.       'I' : Begin
  553.                b:=ord('I');
  554.                Write(tabel,b);
  555.                Wr_word(tabel,ind_leftmargin);
  556.                Wr_word(tabel,ind_rightmargin);
  557.  
  558.                If ind_text2
  559.                Then Begin
  560.                        b:=01;
  561.                        Write(tabel,b)
  562.                     End
  563.                Else Begin
  564.                        b:=00;
  565.                        Write(tabel,b)
  566.                     End;
  567.  
  568.             End;
  569.  
  570.    End;  {Case}
  571.  
  572.    b := Ord(line_term);
  573.    write(tabel,b);
  574.  
  575.    b:=$FF;
  576.    Write(tabel,b);
  577.  
  578. End;
  579.  
  580.  
  581. Procedure Reset_attr_rij(d : Integer);
  582. Var
  583.    j : Integer;
  584.  
  585. Begin
  586.    For j:=0 to 16
  587.    Do attr_rij[d,j]:=$00;
  588.    leegptr[d]:=1;
  589.    openptr[d]:=0;
  590. End;
  591.  
  592.  
  593.  
  594. Procedure Open_all_attr;
  595. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  596.  
  597. Var j:Integer;
  598. Begin
  599.   For j:=(openptr[depth]+1) to (leegptr[depth]-1)
  600.   Do Begin
  601.          Write(strip,Open_com[attr_rij[depth,j]]);
  602.          openptr[depth]:=openptr[depth]+1;
  603.       End;
  604.  
  605.   open_attr_rij[depth]:=False            { Alle attributen staan weer goed }
  606. End;
  607.  
  608.  
  609.  
  610. Procedure Close_all_attr;
  611. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  612. Var j:Integer;
  613. Begin
  614.   For j:=openptr[depth] Downto 1
  615.   Do Begin
  616.         Write(strip,Close_com[attr_rij[depth,j]]);
  617.         openptr[depth]:=openptr[depth]-1;
  618.      End;
  619.   open_attr_rij[depth] := True;
  620. End;
  621.  
  622.  
  623.  
  624. Procedure Attr_ON;
  625. { Deze procedure plaatst een attribuut (lettertype) in de attribuut-rij }
  626.  
  627. Var
  628.    b : Byte;
  629.  
  630. Begin
  631.    Read(wpd,b);                             { lees attribuut-code }
  632.  
  633.    attr_rij[depth,leegptr[depth]]:=b;       { attribuut in attr-rij }
  634.    leegptr[depth]:=leegptr[depth]+1;        { plaats 1 verder. }
  635.    open_attr_rij[depth]:=True;              { openstaande attr-rij }
  636.  
  637.    Read(wpd,b);                             { lees voorbij afsluitcode }
  638. End;
  639.  
  640.  
  641.  
  642. Procedure Attr_OFF;
  643. { Deze procedure haalt een uit een attribuut (lettertype) uit de }
  644. { attribuut-rij door middel van een stack principe omdat binnen  }
  645. { LaTeX de later geopende kommando's eerst afgesloten te worden  }
  646.  
  647. Var
  648.    b       : Byte;
  649.    found   : Boolean;
  650.    j,
  651.    codeptr : Integer;
  652.  
  653. Begin
  654.    Read(wpd,b);                             { lees attribuut-code }
  655.  
  656.    j:=leegptr[depth];                       { zoek vanaf top attr-rij }
  657.    found:=False;                            { nog niet gevonden }
  658.  
  659.    While (j>1) and (Not found)              { zoek attr-code in attr-rij }
  660.    Do Begin
  661.         j:=j-1;
  662.         found:=(attr_rij[depth,j]=b)
  663.       End;
  664.  
  665.    If j<=0 Then RunError($0100);            { Moet nooit kunnen voorkomen }
  666.    codeptr:=j;                              { plaats van attr-code in rij }
  667.  
  668. { Sluit alle commando's t/m de desbetreffende code als deze nog niet }
  669. { gesloten zijn.                                                     }
  670.  
  671.    If codeptr<=openptr[depth]
  672.    Then Begin
  673.            For j:=openptr[depth] downto codeptr
  674.            Do Begin
  675.                  Write(strip,Close_com[attr_rij[depth,j]]);
  676.                  openptr[depth]:=openptr[depth]-1;
  677.               End;
  678.         End;
  679.  
  680. { Haal de desbetreffende attribuut uit de rij en werk pointers bij }
  681.  
  682.    For j:=codeptr to (leegptr[depth]-1)
  683.    Do attr_rij[depth,j]:=attr_rij[depth,j+1];
  684.    leegptr[depth]:=leegptr[depth]-1;
  685.  
  686.    open_attr_rij[depth]:=True;                { openstaande attr-rij }
  687.  
  688.    Read(wpd,b);                               { lees voorbij afsluitcode }
  689. End;
  690.  
  691.  
  692.  
  693. Procedure Center;
  694. { Deze procedure zorgt voor center environment zolang er nog geen }
  695. { andere environment is begonnen.                                 }
  696.  
  697. Begin
  698.    If envir=' '
  699.    Then envir:='C';                    { environment = center }
  700.  
  701.    Jump_in_file(wpd,7);                { rest van code overslaan }
  702. End;
  703.  
  704.  
  705.  
  706. Procedure End_Align;
  707. Begin
  708.    If align_tab
  709.    Then Begin
  710.            Close_all_attr;
  711.            Write(strip,'\''');
  712.            align_tab := False;
  713.            Open_all_attr;
  714.         End;
  715.  
  716.    If right_tab
  717.    Then Begin
  718.            Close_all_attr;
  719.            Write(strip,'\''');
  720.            right_tab := False;
  721.            Open_all_attr;
  722.         End;
  723.  
  724.    If center_tab
  725.    Then Begin
  726.            Close_all_attr;
  727.            Write(strip,'}');
  728.            center_tab := False;
  729.            Open_all_attr;
  730.         End;
  731. End;
  732.  
  733.  
  734.  
  735. Procedure Tab;
  736. Var
  737.    j : integer;
  738.    wpu : word;
  739.    tabnum,
  740.    new_tabs : Integer;
  741.  
  742. Begin
  743.    If (envir<>'I') and Not Nomore_valid_tabs      { Noggeen indent --> normaal tab }
  744.    Then Begin
  745.            If by=$48
  746.            Then right_tab := True;
  747.  
  748.            If by=$40
  749.            Then align_tab := True;
  750.  
  751.            If by=$C8
  752.            Then center_tab := True;
  753.  
  754.            Jump_in_file(wpd,2);
  755.  
  756.            Rd_word(wpd,wpu);                       { Lees abs.-indent [wpu] }
  757.            wpu := wpu - WP_sidemargin;             { Correctie ivm WP kantlijn }
  758.  
  759.            tabnum:=0;
  760.            For j:=1 to num_of_tabs                 { Bepaal welke tabpos }
  761.            Do If wpu>=tabpos[j]
  762.               Then tabnum:=j;
  763.  
  764.            new_tabs := tabnum - latex_tabpos;
  765.  
  766.            If new_tabs>0
  767.            Then Begin
  768.                    Close_all_attr;
  769.  
  770.                    For j:=1 to new_tabs
  771.                    Do Write(strip,'\>');
  772.  
  773.                    If center_tab
  774.                    Then Write(strip,'\ctab{');
  775.  
  776.                    Open_all_attr;
  777.                 End;
  778.  
  779.            latex_tabpos:=tabnum;
  780.  
  781.            Jump_in_file(wpd,3);
  782.  
  783.            envir:='T';                              { Er zit een tab in deze regel }
  784.         End
  785.  
  786.    Else Jump_in_file(wpd,7);
  787.  
  788. End;
  789.  
  790.  
  791.  
  792. Procedure Flush_right_tab;
  793. Begin
  794.    If envir<>'I'
  795.    Then Begin
  796.            Close_all_attr;
  797.            Write(strip,'\`');
  798.            Open_all_attr;
  799.  
  800.            Nomore_valid_tabs := True;
  801.  
  802.            envir:='T';
  803.         End;
  804.  
  805.    Jump_in_file(wpd,7);
  806. End;
  807.  
  808.  
  809.  
  810. Procedure Indent;
  811. Var
  812.    dif,
  813.    abs        : Word;
  814.    b          : Byte;
  815.  
  816. Begin
  817.    If envir<>'T'
  818.    Then Begin       {Al een tabcommando gezet dus er mag geen insp }
  819.            Envir:='I';
  820.            indenting:=True;
  821.  
  822.            If Not ind_text2
  823.            Then Begin
  824.                    Read(wpd,b);
  825.                    b:=b And $01;
  826.  
  827.                    Rd_word(wpd,dif);
  828.                    Rd_word(wpd,abs); { Eigenlijk Old current column }
  829.                    Rd_word(wpd,abs);
  830.  
  831.                    ind_leftmargin:=abs-WP_sidemargin;
  832.  
  833.                    If b=1
  834.                    Then ind_rightmargin:=ind_rightmargin+dif;
  835.                    {Margins bepaald lees voorby rest van functie-codes }
  836.                    Jump_in_file(wpd,3);
  837.  
  838.                    If Not ind_text1
  839.                    Then Begin
  840.                            If char_on_line
  841.                            Then Begin
  842.                                    Write(strip,'}');
  843.                                    ind_text1:=True;
  844.                                 End;
  845.                          End;
  846.                  End
  847.            Else Jump_in_file(wpd,10);
  848.         End
  849.    Else Jump_in_file(wpd,10);
  850. End;
  851.  
  852.  
  853. Procedure End_of_indent;
  854. Begin
  855.    indent_end := True;
  856.    Jump_in_file(wpd,5);
  857. End;
  858.  
  859.  
  860.  
  861. Procedure Tabset;
  862. Var
  863.    j           : Integer;
  864.    w           : Word;
  865.    b           : Byte;
  866.  
  867. Begin
  868.    Jump_in_file(wpd,102);        { Ga naar TAB-info }
  869.  
  870.    num_of_tabs:=0;
  871.  
  872.    For j:=1 to 40
  873.    Do Begin
  874.          Rd_word(wpd,w);
  875.          If (w>WP_sidemargin) and (w<>$FFFF)
  876.          Then Begin
  877.                  num_of_tabs:=num_of_tabs+1;
  878.                  tabpos[num_of_tabs] := w - WP_sidemargin;
  879.               End;
  880.       End;
  881.  
  882.    Jump_in_file(wpd,24);
  883.  
  884.    Make_tabelentry_tabset;
  885. End;
  886.  
  887.  
  888.  
  889. Procedure Page_number_position;
  890. Var
  891.    position_code : Byte;
  892.  
  893. Begin
  894.    Jump_in_file(wpd,5);            {Skip length of code; always 10}
  895.                                    { + old information }
  896.    Read(wpd,position_code);
  897.  
  898.    Write(strip,'\pagenumpos');
  899.    Case position_code of
  900.      $01 : Write(strip,'{\pntl}');
  901.      $02 : Write(strip,'{\pntc}');
  902.      $03 : Write(strip,'{\pntr}');
  903.      $05 : Write(strip,'{\pnbl}');
  904.      $06 : Write(strip,'{\pnbc}');
  905.      $07 : Write(strip,'{\pnbr}');
  906.      Else  Write(strip,'{\pnno}');
  907.    End;
  908.  
  909.    Jump_in_file(wpd,6);
  910. End;
  911.  
  912.  
  913.  
  914. Procedure Character;
  915. Var
  916.    ch          : String;
  917.  
  918.    j           : Integer;
  919.    chr_code,
  920.    chr_set,
  921.    b           : Byte;
  922.    found       : Boolean;
  923.  
  924.  
  925. Begin
  926.    If open_attr_rij[depth]
  927.    Then Open_all_attr;
  928.  
  929.    Case by of
  930.       $20..$7F : { Normal_char  }
  931.                  Begin
  932.                     ch := lat[by];
  933.                  End;
  934.  
  935.       $A9      : { Special_char }
  936.                  Begin
  937.                     If by=$A9
  938.                     Then ch:='-'
  939.                     Else ch:='\ ';
  940.                  End;
  941.  
  942.       $C0      : { Extended_char }
  943.                  Begin
  944.                     j:=127;
  945.                     found:=false;
  946.  
  947.                     Read(wpd,chr_code);
  948.                     Read(wpd,chr_set);
  949.  
  950.                     While (j<254) and not found
  951.                     Do Begin
  952.                           j:=j+1;
  953.                           If (chr_code=char_code[j]) and (chr_set=char_set[j])
  954.                           Then found:=True;
  955.                        End;
  956.  
  957.                     If found
  958.                     Then ch:=ext_lat[j]
  959.                     Else ch:='\ ';
  960.  
  961.                     Read(wpd,b);
  962.                  End;
  963.  
  964.       End;
  965.  
  966.    Write(strip,ch);
  967.  
  968. End;
  969.  
  970.  
  971.  
  972. Procedure Return_Page;
  973. Var
  974.    j :Integer;
  975.    ond : Boolean;
  976.  
  977. Begin
  978.  
  979.    Case by of
  980.     $0A,$8C : line_term := 'R';     { Hard return }
  981.       $0D   : line_term := 'r';     { Soft return }
  982.       $0C   : line_term := 'P';     { Hard page }
  983.       $0B   : line_term := 'p';     { Soft page }
  984.    End;
  985.  
  986.    Writeln(strip);
  987.  
  988.    Make_Tabelentry_envir_extra_end;
  989.  
  990.    If indent_end
  991.    Then Begin
  992.            envir:=' ';
  993.            indenting:=False;
  994.            ind_text1:=False;
  995.            ind_text2:=False;
  996.            ind_leftmargin:=0;
  997.            ind_rightmargin:=0;
  998.  
  999.            indent_end:=False;
  1000.         End
  1001.  
  1002.    Else If envir<>'I'
  1003.         Then envir:=' ';
  1004.  
  1005.    char_on_line:=False;
  1006.    nomore_valid_tabs := False;
  1007.  
  1008.    regelnum:=regelnum+1;
  1009.  
  1010.    Make_tabelentry_attr;
  1011.  
  1012.    latex_tabpos:=0;
  1013. End;
  1014.  
  1015.  
  1016. Procedure Nop80;
  1017. Begin
  1018.    { Om dat het een 1-byte funktie is hoeft er niks overgeslagen }
  1019.    { te worden.                                                  }
  1020. End;
  1021.  
  1022.  
  1023.  
  1024. Procedure NopC0;
  1025. Begin
  1026.    If by=$C0 Then Jump_in_file(wpd,3);
  1027.    If by=$C1 Then Jump_in_file(wpd,8);
  1028.    If by=$C2 Then Jump_in_file(wpd,10);
  1029.    If by=$C3 Then Jump_in_file(wpd,2);
  1030.    If by=$C4 Then Jump_in_file(wpd,2);
  1031.    If by=$C5 Then Jump_in_file(wpd,4);
  1032.    If by=$C6 Then Jump_in_file(wpd,5);
  1033.    If by=$C7 Then Jump_in_file(wpd,6);
  1034. End;
  1035.  
  1036.  
  1037.  
  1038. Procedure NopD0(already_read_subfunc_code : Boolean);
  1039. Var
  1040.    b : Byte;
  1041.    w : Word;
  1042.  
  1043. Begin
  1044.    If Not already_read_subfunc_code
  1045.    Then Read(wpd,b);      { Lees subfunctioncode }
  1046.  
  1047.    Rd_word(wpd,w);       { Lees lengte 'die nog volgt ' }
  1048.    Seek(wpd,filepos(wpd)+w);
  1049. End;
  1050.  
  1051.  
  1052.  
  1053. Procedure Overstrike;
  1054.  
  1055. Var
  1056.    first_char_os    : Boolean;
  1057.  
  1058.    char_width_os,
  1059.    len_of_code      : Word;
  1060.    end_of_code      : LongInt;
  1061.  
  1062. Begin
  1063.    Rd_word(wpd,len_of_code);             { Lees lengte }
  1064.    end_of_code := filepos(wpd) + len_of_code - 4;
  1065.  
  1066.    Rd_word(wpd,char_width_os);
  1067.  
  1068.    first_char_os := True;
  1069.  
  1070.    While FilePos(wpd) < end_of_code
  1071.    Do Begin
  1072.          Read(wpd,by);
  1073.  
  1074.          Case by of
  1075.            $20..$7F,
  1076.            $A9,$C0  : If first_char_os
  1077.                       Then Begin
  1078.                               Character;
  1079.                               first_char_os := False;
  1080.                            End
  1081.                       Else Begin
  1082.                               Write(strip,'\llap{');
  1083.                               Character;
  1084.                               Write(strip,'}');
  1085.                            End;
  1086.  
  1087.            $00..$BF : Nop80;
  1088.            $C0..$CF : NopC0;
  1089.            $D0..$FE : NopD0(False);
  1090.          End;
  1091.  
  1092.       End;
  1093.  
  1094.    Jump_in_file(wpd,4);
  1095.  
  1096. End;
  1097.  
  1098.  
  1099.  
  1100. Procedure Footnote;
  1101. Var
  1102.    flags,
  1103.    num_of_pages     : Byte;
  1104.  
  1105.    fn_num,
  1106.    len_of_code      : Word;
  1107.    end_of_code      : LongInt;
  1108.  
  1109. Begin
  1110.    Rd_word(wpd,len_of_code);             { Lees lengte }
  1111.    end_of_code := filepos(wpd) + len_of_code - 4;
  1112.  
  1113.    Read(wpd,flags);
  1114.  
  1115.    Rd_word(wpd,fn_num);
  1116.  
  1117. { Skip all the shit }
  1118.  
  1119.    Read(wpd,num_of_pages);
  1120.    Jump_in_file(wpd,2*(num_of_pages+1)+9);
  1121.  
  1122.    Close_all_attr;
  1123.  
  1124.    depth := 1;
  1125.    Reset_attr_rij(depth);
  1126.  
  1127.    Write(strip,'\footnote[',fn_num:1,']{');
  1128.  
  1129.    While FilePos(wpd) < end_of_code
  1130.    Do Begin
  1131.          Read(wpd,by);
  1132.  
  1133.          Case by of
  1134.            $20..$7F,
  1135.            $A9,$C0  : Character;
  1136.  
  1137.            $0A,$0C  : Write(strip,'\\ ');
  1138.  
  1139.            $0B,$0D  : Write(strip,' ');
  1140.  
  1141.             $C3     : Attr_ON;
  1142.  
  1143.             $C4     : Attr_OFF;
  1144.  
  1145.            $00..$BF : Nop80;
  1146.            $C0..$CF : NopC0;
  1147.            $D0..$FE : NopD0(False);
  1148.          End;
  1149.  
  1150.       End;
  1151.  
  1152.    Close_all_attr;      { Echt nodig ? }
  1153.    Write(strip,'}');
  1154.  
  1155.    Jump_in_file(wpd,4);
  1156.  
  1157.    depth := 0;
  1158.    Open_all_attr;
  1159.  
  1160. End;
  1161.  
  1162.  
  1163.  
  1164. Procedure Header_Footer;
  1165. Var
  1166.    subfunc,
  1167.    occurance : Byte;
  1168.    len_of_code : Word;
  1169.    end_of_code : LongInt;
  1170.  
  1171.    hf_left,
  1172.    hf_center,
  1173.    hf_right  : Boolean;
  1174.  
  1175.    j : Integer;
  1176.  
  1177. Begin
  1178.    Read(wpd,subfunc);
  1179.    Rd_word(wpd,len_of_code);
  1180.  
  1181.    If len_of_code > 22
  1182.    Then Begin
  1183.            end_of_code := FilePos(wpd) + len_of_code - 4;
  1184.  
  1185.            Jump_in_file(wpd,7);
  1186.  
  1187.            Read(wpd,occurance);
  1188.  
  1189.            Jump_in_file(wpd,10);
  1190.  
  1191.            Close_all_attr;
  1192.            depth := 1;
  1193.  
  1194. { Geen schone attr._lei; Kopieer attributen uit Niveau 0;  Fout in WP 5.0 ? }
  1195.  
  1196.            For j:=0 to 15
  1197.            Do attr_rij[1,j] := attr_rij[0,j];
  1198.  
  1199.            leegptr[1]:=leegptr[0];
  1200.            openptr[1]:=openptr[0];
  1201.  
  1202.            Case subfunc of
  1203.              00,01 : Write(strip,'\headtext');
  1204.              02,03 : Write(strip,'\foottext');
  1205.            End;
  1206.  
  1207.            Case occurance of
  1208.              00 : Write(strip,'{\neverpages}{');
  1209.              01 : Write(strip,'{\allpages}{');
  1210.              02 : Write(strip,'{\oddpages}{');
  1211.              03 : Write(strip,'{\evenpages}{');
  1212.            End;
  1213.  
  1214.            Open_all_attr;
  1215.            hf_left   := True;           { Beginnen met de linkerkant }
  1216.            hf_center := False;
  1217.            hf_right  := False;
  1218.  
  1219.            While FilePos(wpd) < end_of_code
  1220.            Do Begin
  1221.                  Read(wpd,by);
  1222.  
  1223.                  Case by of
  1224.                    $20..$7F,
  1225.                    $A9,$C0  : Character;
  1226.  
  1227.  
  1228.                      $C1    : Begin
  1229.                                  Read(wpd,by);
  1230.                                  by := by and $E0;
  1231.                                  Jump_in_file(wpd,7);
  1232.  
  1233.                                  If by=$E0
  1234.                                  Then Begin
  1235.                                          If hf_left
  1236.                                          Then Begin
  1237.                                                  Close_all_attr;
  1238.                                                  Write(strip,'}{');
  1239.                                                  Open_all_attr;
  1240.  
  1241.                                                  hf_left   := False;
  1242.                                                  hf_center := True;
  1243.                                               End;
  1244.                                       End;
  1245.  
  1246.                                  If by=$60
  1247.                                  Then Begin
  1248.                                          If hf_left
  1249.                                          Then Begin
  1250.                                                  Close_all_attr;
  1251.                                                  Write(strip,'}{}{');
  1252.                                                  Open_all_attr;
  1253.  
  1254.                                                  hf_left  := False;
  1255.                                                  hf_right := True;
  1256.                                               End;
  1257.  
  1258.                                          If hf_center
  1259.                                          Then Begin
  1260.                                                  Close_all_attr;
  1261.                                                  Write(strip,'}{');
  1262.                                                  Open_all_attr;
  1263.  
  1264.                                                  hf_center := False;
  1265.                                                  hf_right  := True;
  1266.                                               End;
  1267.                                       End;
  1268.                               End;
  1269.  
  1270.                      $C3    : Attr_ON;
  1271.  
  1272.                      $C4    : Attr_OFF;
  1273.  
  1274.                    $00..$BF : Nop80;
  1275.                    $C0..$CF : NopC0;
  1276.                    $D0..$FE : NopD0(False);
  1277.  
  1278.                  End;
  1279.               End;
  1280.  
  1281.            Close_all_attr;      { Echt nodig ? }
  1282.  
  1283.            Jump_in_file(wpd,4);
  1284.  
  1285.            If hf_left   Then Write(strip,'}{}{}');
  1286.            If hf_center Then Write(strip,'}{}');
  1287.            If hf_right  Then Write(strip,'}');
  1288.  
  1289.            depth := 0;
  1290.            Open_all_attr;
  1291.  
  1292.         End
  1293.  
  1294.    Else Jump_in_file(wpd,len_of_code);
  1295.  
  1296. End;
  1297.  
  1298.  
  1299. Begin
  1300.    Table_Init;
  1301.    Ext_chr_init;
  1302.  
  1303.    Reset_attr_rij(0);
  1304.    Reset_attr_rij(1);
  1305.    depth := 0;
  1306.  
  1307.    WP_default;
  1308.  
  1309.    latex_tabpos:=0;
  1310.    right_tab := False;
  1311.    align_tab := False;
  1312.    center_tab := False;
  1313.  
  1314.    indenting:=False;
  1315.    indent_end:=False;
  1316.    ind_text1:=False;
  1317.    ind_text2:=False;
  1318.    ind_leftmargin:=0;
  1319.    ind_rightmargin:=0;
  1320.  
  1321.    envir:=' ';
  1322.  
  1323.    nomore_valid_tabs := False;
  1324.  
  1325.    Writeln('First strike :');
  1326.    Write('Converting-percentage :     ');
  1327.  
  1328.    srtdocpos:=filepos(wpd);
  1329.    fsize:=FileSize(wpd);
  1330.  
  1331.    regelnum := 0;
  1332.  
  1333.    Make_tabelentry_attr;           { attribuut instelling }
  1334.  
  1335.    Make_tabelentry_tabset;         { Geef de defaulttabinstelling door }
  1336.                                    { aan de 2e slag }
  1337.  
  1338.   
  1339.  
  1340.    While (FilePos(wpd)<fsize)
  1341.    Do Begin
  1342.         convperc:=round((FilePos(wpd)-srtdocpos)/(fsize-srtdocpos)*100);
  1343.         Write(chr(8),chr(8),chr(8),chr(8),convperc:3,'%');
  1344.  
  1345.         Read(wpd,by);
  1346.  
  1347.         Case by of
  1348.           $20..$7F,
  1349.           $A9,$C0  : Begin
  1350.                          char_on_line:=True;            {Er (al) is een karakter op deze regel }
  1351.                          If indenting                   {Als er is ingeprongen er na een stuk }
  1352.                          Then If ind_text1              {tekst is weer ingesprongen (ind_text1) }
  1353.                               Then ind_text2:=True;     {dan hoort dit char bij het ind_txt-blok }
  1354.  
  1355.                          Character;
  1356.                       End;
  1357.  
  1358.           $0A,$0D,
  1359.           $0B,$0C,
  1360.           $8C      : Return_Page;
  1361.  
  1362.           $C1      : Begin
  1363.                         Read(wpd,by);
  1364.                         by:=by and $E8;
  1365.  
  1366.                         Case by of
  1367.                           $00,$C8,
  1368.                           $48,$40     : Tab;
  1369.                           $60         : Flush_right_tab;
  1370.                           $E0         : Center;
  1371.                           Else          Jump_in_file(wpd,7);
  1372.                         End;
  1373.                      End;
  1374.           $81,$82  : Make_tabelentry_rightjustification;
  1375.           $83      : End_Align;
  1376.           $C3      : Attr_ON;
  1377.           $C4      : Attr_OFF;
  1378.           $C2      : Indent;
  1379.           $C6      : End_of_indent;
  1380.           $C5,$C7  : NopC0;
  1381.  
  1382.           $D0      : Begin
  1383.                         Read(wpd,by);
  1384.                         Case by of
  1385.                           $04 : Tabset;
  1386.                           $08 : Page_number_position;
  1387.                           Else  NopD0(True);
  1388.                         End;
  1389.                      End;
  1390.  
  1391.           $D5      : Header_Footer;
  1392.  
  1393.           $D6      : Begin
  1394.                         Read(wpd,by);
  1395.                         Case by of
  1396.                           $00 : Footnote;
  1397.                           Else NopD0(True);
  1398.                         End;
  1399.                      End;
  1400.  
  1401.           $D8      : Begin
  1402.                         Read(wpd,by);
  1403.                         Case by of
  1404.                           $02 : Overstrike;
  1405.                           Else NopD0(True);
  1406.                         End;
  1407.                      End;
  1408.  
  1409.           $00..$1F,
  1410.           $80..$BF : Nop80;
  1411.  
  1412.           $D0..$FF : NopD0(False);
  1413.  
  1414.         End;
  1415.       End;
  1416.  
  1417.    Writeln;
  1418.    Make_tabelentry_envir_extra_end;
  1419.  
  1420.    num_of_lines_stripfile := regelnum;
  1421.  
  1422. End;
  1423.  
  1424.  
  1425. {---SLAG2---}
  1426.  
  1427. Procedure Convert_second_strike;
  1428. Var
  1429.    regelnum : Word;
  1430.    convperc : Integer;
  1431.  
  1432.    underline,
  1433.    illegal_argument,
  1434.    just_envir_closed      : Boolean;
  1435.  
  1436.    i     : Integer;
  1437.  
  1438.    regel,
  1439.    hulp_regel            : String;
  1440.    len_reg               : Integer;
  1441.  
  1442.    num_of_tabs           : Integer;
  1443.    tabpos                : Array [1..40] of Word;
  1444.  
  1445.    tabent_num_of_tabs    : Array [0..2] of Integer;
  1446.    tabent_tabpos         : Array [0..2,1..40] of Word;
  1447.  
  1448.    ind_leftmargin,
  1449.    ind_rightmargin       : Array [0..2] of Word;
  1450.    ind_label             : Array [0..2] of Byte;
  1451.  
  1452.    pre,
  1453.    cur,
  1454.    next     : Integer;
  1455.  
  1456.    envir,
  1457.    line_term  : Array [0..2] of Char;
  1458.    new_tabset : Array [0..2] of Boolean;
  1459.  
  1460.    rightjust,
  1461.    new_rightjust         : Boolean;
  1462.    new_tabent_rightjust,
  1463.    tabent_rightjust      : Array [0..2] of Boolean;
  1464.  
  1465.    num_of_attr : Array[0..2] of Integer;
  1466.    attr_BOL    : Array[0..2,$00..$10] of Byte;
  1467.    attr_closed : Boolean;
  1468.  
  1469.  
  1470.  
  1471. Procedure Read_tabelentry(n:Integer);
  1472. Var
  1473.    w  : Word;
  1474.    b  : Byte;
  1475.    j  : Integer;
  1476.  
  1477. Begin
  1478.    { Begin met een schone lei die dan door deze procedure verder wordt }
  1479.    { opgevuld. }
  1480.  
  1481.    envir[n]:=' ';
  1482.    new_tabset[n]:=False;
  1483.    new_tabent_rightjust[n]:=False;
  1484.  
  1485.    num_of_attr[n] := 0;
  1486.    For j:=1 to 16
  1487.    Do attr_BOL[n,j]:=0;
  1488.  
  1489.    If filepos(tabel)<filesize(tabel)
  1490.    Then Begin
  1491.  
  1492.            Read(tabel,b);
  1493.            num_of_attr[n] := b;
  1494.            For j:=1 to num_of_attr[n]
  1495.            Do Read(tabel,Attr_BOL[n,j]);
  1496.  
  1497.            b:=$00;
  1498.            While b<>$FF
  1499.            Do Begin
  1500.                  Read(tabel,b);
  1501.  
  1502.                  Case chr(b) Of
  1503.                    'C' : envir[n]:='C';
  1504.                    'T' : envir[n]:='T';
  1505.                    'I' : Begin
  1506.                             envir[n]:='I';
  1507.                             Rd_word(tabel,ind_leftmargin[n]);
  1508.                             Rd_word(tabel,ind_rightmargin[n]);
  1509.                             Read(tabel,ind_label[n]);
  1510.                          End;
  1511.  
  1512.                    'S' : Begin
  1513.                             new_tabset[n]:=True;
  1514.                             Read(tabel,b);
  1515.                             tabent_num_of_tabs[n]:=b;
  1516.  
  1517.                             For j:=1 to tabent_num_of_tabs[n]
  1518.                             Do Begin
  1519.                                   Rd_word(tabel,w);
  1520.                                   tabent_tabpos[n,j]:=w;
  1521.                                End;
  1522.                          End;
  1523.  
  1524.                    'U' : Begin
  1525.                             new_tabent_rightjust[n]:=True;
  1526.                             Read(tabel,b);
  1527.                             If b=0
  1528.                             Then tabent_rightjust[n]:=False
  1529.                             Else tabent_rightjust[n]:=True;
  1530.                          End;
  1531.  
  1532.                    'R','r','P','p' : line_term[n]:=chr(b);
  1533.  
  1534.                 End {Case};
  1535.               End;
  1536.         End
  1537.  
  1538. { Er is geen volgende tabelentry dus ook geen volgende regel }
  1539. { De tabelentry is 'schoon'.                                 }
  1540. { Zodat het document 'schoon' wordt afgesloten.              }
  1541.  
  1542. End;
  1543.  
  1544.  
  1545.  
  1546. Procedure Open_all_attr_BOL;
  1547. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  1548. Var
  1549.    j:Integer;
  1550. Begin
  1551.    For j:=$01 to num_of_attr[cur]
  1552.    Do Write(latex,Open_com[attr_BOL[cur,j]]);
  1553.  
  1554.    attr_closed := False;
  1555. End;
  1556.  
  1557.  
  1558. Procedure Close_all_attr_BOL;
  1559. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  1560. Var
  1561.    j:Integer;
  1562. Begin
  1563.    For j:=num_of_attr[cur] Downto $01
  1564.    Do Write(latex,Close_com[Attr_BOL[cur,j]]);
  1565.  
  1566.    attr_closed := True;
  1567. End;
  1568.  
  1569.  
  1570.  
  1571. Procedure Open_all_attr_EOL;
  1572. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  1573. Var j:Integer;
  1574. Begin
  1575.   For j:=$01 to num_of_attr[next]
  1576.   Do Write(latex,Open_com[Attr_BOL[next,j]]);
  1577.  
  1578.   attr_closed := False;
  1579. End;
  1580.  
  1581.  
  1582.  
  1583. Procedure Close_all_attr_EOL;
  1584. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  1585. Var j:Integer;
  1586. Begin
  1587.   For j:=num_of_attr[next] Downto $01
  1588.   Do Write(latex,Close_com[Attr_BOL[next,j]]);
  1589.  
  1590.   attr_closed := True;
  1591. End;
  1592.  
  1593.  
  1594.  
  1595. Procedure Latex_head;
  1596. { -- Maak het de standard-heading voor een latex-file aan -- }
  1597. Begin
  1598.   Writeln(latex,'\documentstyle[11pt,wp2latex]{report}');
  1599.   Writeln(latex,'\begin{document}')
  1600. End;
  1601.  
  1602.  
  1603.  
  1604. Procedure Latex_foot;
  1605. { -- Sluit de latex-file op de juiste wijze af -- }
  1606. Begin
  1607.   Writeln(latex,'\end{document}')
  1608. End;
  1609.  
  1610.  
  1611.  
  1612. Procedure Latex_tabset;
  1613. Var
  1614.    atpr,j    : Integer;
  1615.    l,ol : Real;
  1616.  
  1617. Begin
  1618.    atpr:=0;                  { Huiding aantal tabs per regel }
  1619.    ol:=0;
  1620.    For j:=1 to num_of_tabs
  1621.    Do Begin
  1622.          l:=tabpos[j]/1200 * 2.54;
  1623.          Write(latex,'\hspace{', l-ol :3:2,'cm}\=');
  1624.          atpr:=atpr+1;
  1625.          If atpr>=4
  1626.          Then Begin
  1627.                  Writeln(latex,'%');
  1628.                  atpr:=0;
  1629.               End;
  1630.          ol:=l;
  1631.       End;
  1632.    Writeln(latex,'\kill');
  1633. End;
  1634.  
  1635.  
  1636.  
  1637. Function Change_envir_BOL : Boolean;
  1638. Var
  1639.    hulp : Boolean;
  1640.  
  1641. Begin
  1642.    hulp := False;
  1643.  
  1644.    hulp := ((envir[cur]='C') And Not (envir[pre]='C')) Or hulp;
  1645.    hulp := ((envir[cur]='T') And Not (envir[pre]='T')) Or hulp;
  1646.    hulp := ((envir[cur]='I') And Not (envir[pre]='I')) Or hulp;
  1647.  
  1648.    change_envir_BOL := hulp;
  1649. End;
  1650.  
  1651.  
  1652.  
  1653. Function Change_envir_EOL : Boolean;
  1654. Var
  1655.    hulp : Boolean;
  1656.  
  1657. Begin
  1658.    hulp := False;
  1659.  
  1660.    hulp := ((envir[next]='C') Xor (envir[cur]='C')) Or hulp;
  1661.    hulp := ((envir[next]='T') Xor (envir[cur]='T')) Or hulp;
  1662.    hulp := ((envir[next]='I') Xor (envir[cur]='I')) Or hulp;
  1663.  
  1664.    change_envir_EOL := hulp;
  1665. End;
  1666.  
  1667.  
  1668.  
  1669.  
  1670. Procedure Open_environment;
  1671.  
  1672. Begin
  1673.    If change_envir_BOL                 { andere environment ? }
  1674.    Then Begin
  1675.            If Not attr_closed
  1676.            Then Close_all_attr_BOL;
  1677.  
  1678.            Case envir[cur] of
  1679.               'C' : Begin
  1680.                        Writeln(latex,'\begin{center}');
  1681.                     End;
  1682.  
  1683.               'T' : Begin
  1684.                        Writeln(latex,'\begin{tabbing}');
  1685.                        Latex_tabset;
  1686.                     End;
  1687.  
  1688.               'I' : Begin
  1689.                        Write(latex,'\begin{indenting}');
  1690.                        Write(latex,'{',ind_leftmargin[cur]/1200*2.54:3:2,'cm}');
  1691.                        Write(latex,'{',ind_rightmargin[cur]/1200*2.54:3:2,'cm}');
  1692.                        If ind_label[cur]=1
  1693.                        Then Begin
  1694.                                Writeln(latex,'%');
  1695.                                Write(latex,'{');
  1696.                             End
  1697.                        Else Writeln(latex,'{}');
  1698.                     End
  1699.            End;
  1700.  
  1701.         End
  1702.  
  1703.    Else If new_tabset[cur] and (envir[cur]='T')
  1704.         Then Latex_tabset;
  1705.  
  1706. End;
  1707.  
  1708.  
  1709.  
  1710. Procedure Close_environment;
  1711.  
  1712. Begin
  1713.  
  1714.            Case envir[cur] of
  1715.               'C' : Begin
  1716.                        Writeln(latex,'\end{center}');
  1717.                     End;
  1718.  
  1719.               'T' : Begin
  1720.                        Writeln(latex,'\end{tabbing}');
  1721.                     End;
  1722.  
  1723.               'I' : Begin
  1724.                        Writeln(latex,'\end{indenting}');
  1725.                     End;
  1726.            End;
  1727.  
  1728.            just_envir_closed := True;
  1729.  
  1730. End;
  1731.  
  1732.  
  1733.  
  1734. Procedure Update_global_information;
  1735. Var
  1736.    j : Integer;
  1737.  
  1738. Begin
  1739.    If new_tabset[cur]
  1740.    Then Begin
  1741.            num_of_tabs:=tabent_num_of_tabs[cur];
  1742.            For j:=1 to num_of_tabs
  1743.            Do tabpos[j]:=tabent_tabpos[cur,j]
  1744.         End;
  1745.  
  1746.    If new_tabent_rightjust[cur]
  1747.    Then new_rightjust := tabent_rightjust[cur];
  1748.  
  1749. End;
  1750.  
  1751.  
  1752. Procedure Change_tabelentry;
  1753. Var
  1754.    help : Integer;
  1755.  
  1756. Begin
  1757.    help:=pre;
  1758.    pre:=cur;
  1759.    cur:=next;
  1760.    next:=help;
  1761.    Read_tabelentry(next);
  1762. End;
  1763.  
  1764.  
  1765. Begin
  1766.    pre:=0;
  1767.    cur:=1;
  1768.    next:=2;
  1769.  
  1770.    envir[pre]:=' ';
  1771.    new_tabset[pre]:=False;
  1772.  
  1773.    just_envir_closed:=True;
  1774.    attr_closed := False;
  1775.  
  1776.    rightjust:=True;
  1777.    new_rightjust:=True;
  1778.    For i:=0 to 2
  1779.    Do Begin
  1780.          new_tabent_rightjust[i]:=False;
  1781.          tabent_rightjust[i]:=False;
  1782.       End;
  1783.  
  1784.    Read_tabelentry(cur);
  1785.    Read_tabelentry(next);
  1786.  
  1787.    regelnum:=1;
  1788.  
  1789.    Writeln;
  1790.    Writeln('Second strike :');
  1791.    Write('Converting-percentage :     ');
  1792.  
  1793.   
  1794.  
  1795.    Latex_head;
  1796.  
  1797.    While (Not Eof(strip)) and (not keypressed)
  1798.    Do Begin
  1799.          Update_global_information;
  1800.  
  1801.          convperc := round(100*regelnum/num_of_lines_stripfile);
  1802.          if convperc>100 then convperc:=100;
  1803.          Write(chr(8),chr(8),chr(8),chr(8),convperc:3,'%');
  1804.  
  1805.          Readln(strip,regel);
  1806.  
  1807. { Werk eventueel de regel bij d.m.v. een hulp regel. }
  1808.  
  1809.          hulp_regel := regel;
  1810.          len_reg := length(hulp_regel);
  1811.  
  1812. { Meerdere spaties achter elkaar vervangen door harde spaties. }
  1813.  
  1814.          For i:=1 to len_reg-1
  1815.          Do If (regel[i]=' ') and (regel[i+1]=' ')
  1816.             Then hulp_regel[i+1]:='~';
  1817.  
  1818. { Zoek naar een illegaal argument en zet hier accolades voor. }
  1819.  
  1820.          If ((len_reg>=1) and (hulp_regel[1]='[')) or
  1821.             ((len_reg>=2) and (hulp_regel[1]=' ') and (hulp_regel[2]='['))
  1822.          Then hulp_regel:='{}' + hulp_regel;
  1823.  
  1824. { De regel is verwerkt. }
  1825.  
  1826.          regel := hulp_regel;
  1827.          len_reg := length(regel);
  1828.  
  1829.          If new_rightjust xor rightjust
  1830.          Then Begin
  1831.                  rightjust := new_rightjust;
  1832.                  If rightjust
  1833.                  Then Writeln(latex,'\justified')
  1834.                  Else Writeln(latex,'\raggedright');
  1835.               End;
  1836.  
  1837.          Open_environment;
  1838.  
  1839.          If len_reg>0
  1840.          Then Begin
  1841.                  If attr_closed
  1842.                  Then Open_all_attr_BOL;
  1843.  
  1844.                  Write(latex,regel);
  1845.  
  1846.                  just_envir_closed := False;
  1847.               End;
  1848.  
  1849.          Case line_term[cur] of
  1850.  
  1851.           'r','p' : Begin
  1852.                        Writeln(latex);
  1853.                        If Change_envir_EOL
  1854.                        Then Begin
  1855.                                If Not attr_closed
  1856.                                Then Close_all_attr_EOL;
  1857.  
  1858.                                Close_environment;
  1859.                             End;
  1860.                     End;
  1861.  
  1862.               'R' : Begin
  1863.  
  1864.                        If envir[cur]='I'
  1865.                        Then Begin
  1866.                                If Not attr_closed
  1867.                                Then Close_all_attr_EOL;
  1868.  
  1869.                                Writeln(latex);
  1870.                                Close_environment;
  1871.                                envir[cur]:=' ';
  1872.                             End
  1873.  
  1874.                        Else Begin
  1875.                                underline:=False;
  1876.                                For i:=$01 to $10
  1877.                                Do underline := underline
  1878.                                                Or (Attr_Bol[next,i]=$B)
  1879.                                                Or (Attr_bol[next,i]=$E);
  1880.  
  1881.                                If underline and Not attr_closed
  1882.                                Then Close_all_attr_EOL;
  1883.  
  1884.                        { Elke Indent-environment moet na een harde Return}
  1885.                        { Afgesloten worden.}
  1886.  
  1887.  
  1888.                                If Change_envir_EOL
  1889.                                Then Begin
  1890.                                        If just_envir_closed
  1891.                                        Then Writeln(latex,'\nwln')
  1892.                                        Else Writeln(latex);
  1893.  
  1894.                                        If Not attr_closed
  1895.                                        Then Close_all_attr_EOL;
  1896.  
  1897.                                        Close_environment;
  1898.                                     End
  1899.                                Else Begin
  1900.                                        If just_envir_closed
  1901.                                        Then Writeln(latex,'\nwln')
  1902.                                        Else Writeln(latex,'\\');
  1903.                                      End;
  1904.                             End;
  1905.                     End;
  1906.  
  1907.               'P' : Begin
  1908.                        If Not attr_closed
  1909.                        Then Close_all_attr_EOL;
  1910.  
  1911.                        Writeln(latex);
  1912.                        Close_environment;
  1913.                        Writeln(latex,'\newpage');
  1914.                        envir[cur]:=' ';
  1915.                     End;
  1916.  
  1917.          End {Case};
  1918.  
  1919.  
  1920.  
  1921.          Change_tabelentry;
  1922.  
  1923.          regelnum:=regelnum+1;
  1924.       End;
  1925.  
  1926.    Latex_foot;
  1927.    Writeln;
  1928. End;
  1929.  
  1930.  
  1931. {---HOOFDPROG---}
  1932.  
  1933.  
  1934. Begin
  1935.    Exitsave:=Exitproc;                { Bewaar de orginele exit-pointer }
  1936.    Exitproc:=@Einde_prog;             { Spring bij Exit naar Proc. Einde_prog }
  1937.  
  1938.    Init_commando;
  1939.  
  1940.    ClrScr;
  1941.    Writeln;
  1942.    Writeln('     Conversionprogram : From Wordperfect 5.0 to LaTeX  (WP2latEX)');
  1943.    Writeln;
  1944.    Writeln('  (c) TUE-Eindhoven ---- Made by R.C.Houtepen ---- Date : 24 Jan 1990');
  1945.  
  1946.    Filenames;
  1947.  
  1948.    Reset(wpd);
  1949.    Wpd_check;
  1950.  
  1951.    Rewrite(strip);
  1952.    Rewrite(tabel);
  1953.  
  1954.    Writeln('Converting ...');
  1955.    Writeln;
  1956.  
  1957.    Convert_first_strike;
  1958.  
  1959.    Close(wpd);
  1960.    Close(strip);
  1961.    Close(tabel);
  1962.  
  1963.    Reset(strip);
  1964.    Reset(tabel);
  1965.    Rewrite(latex);
  1966.  
  1967.    Convert_second_strike;
  1968.  
  1969.    Close(strip);
  1970.    Close(tabel);
  1971.    Close(latex);
  1972.  
  1973.    Erase(strip);
  1974.    Erase(tabel);
  1975.  
  1976. End.
  1977.